//
//  ViewController.h
//  C语言
//
//  Created by ws on 2017/7/12.
//  Copyright © 2017年 王松. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

/**
 运行步骤: 编译 --> 链接 --> 运行
 
 编译C程序
 1.计算机只能识别0和1组成的机器指令,你现在写的这些什么int、main这些英文,它是看不懂的
 2.我们需要使用C语言编译器,将源文件翻译成只有0和1的二进制文件,这个翻译过程称为“编译”
 3.使用clang编译one.c文件：cc –c one.c
 4.编译器还有个很实用的功能：检测语法错误
 
 注意:编译器除了能将.c源文件编译成.o目标文件之外，还有一个非常重要的功能:语法检测.跟英语一样，C语言也有自己的语法，如果你不按照C语言语法去写代码,那就无法编译成功.生成目标文件之前,编译器会先检查.c文件是否有语法错误,如果出现语法错误,会列出错误的总个数、错误原因和错误代码的行号,这时候就不会产生目标文件;必须修正相应的语法错误,重新编译成功后,才会生成目标文件.
 
 
 链接C程序
 将所有相关联的.o目标文件、以及C语言函数库组合在一起生成可执行文件的过程,我们称为“链接”.
 
 1.源文件编译成功后,会生成一个.o目标文件,这就是一个二进制文件,但是,还是不能运行
 2.将所有相关联的.o目标文件、以及C语言函数库组合在一起生成可执行文件的过程,我们称为“链接”
 3.使用clang链接one.o文件:cc one.o
 
 注意点:源文件编译成功后,会生成一个.o目标文件,这就是一个二进制文件,但是,还是不能运行.目标文件不能运行的主要原因有2个:
 1> 在开发过程中,不可能将所有的代码都写在一个.c文件中,为了模块化开发,一般会将不同的功能写到不同的源文件中.源文件编译之后,每个源文件都有对应的.o文件,比如two.c生成了two.o、three.c生成了three.o,这些.o文件都不能单独运行,它们之间都有密不可分的关系,需要将所 有相关联的.o目标文件组合在一起.
 2> 除开组合所有的目标文件之后,还需要将C语言的函数库包含进来.才能生成可执行文件.
 
 */

/**
 函数的声明:就是把函数的头copy到调用函数的前面
 作用:告诉编译器这个函数已经存在了,你可以使用了
 
 一个完成的函数包含两部分:一个函数的声明,一个函数的实现(int类型的不许要声明)
 如果一个函数没有写明他的返回值类型,那么他的返回值类型是int类型
 函数的声明与定义(实现)务必保持一致
 */


/**
 预编译
 1.将所有的#define删除，并且展开所有的宏定义。说白了就是字符替换

 2.处理所有的条件编译指令，#ifdef #ifndef #endif等，就是带#的那些

 3.处理#include，将#include指向的文件插入到该行处

 4.删除所有注释

 5.添加行号和文件标示，这样的在调试和编译出错的时候才知道是是哪个文件的哪一行

 6.保留#pragma编译器指令，因为编译器需要使用它们。
 
 
 编译:
 编译的过程实质上是把高级语言翻译成机器语言的过程，即对a.c做了这些事儿

 1.词法分析，

 2.语法分析

 3.语义分析

 4.优化后生成相应的汇编代码

 从 高级语言->汇编语言->机器语言（二进制）
 
 
 
 
 */
@end

